/*
 * @lc app=leetcode.cn id=7 lang=cpp
 *
 * [7] 整数反转
 *
 * https://leetcode-cn.com/problems/reverse-integer/description/
 *
 * algorithms
 * Easy (31.79%)
 * Total Accepted:    89K
 * Total Submissions: 280.1K
 * Testcase Example:  '123'
 *
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 * 
 * 示例 1:
 * 
 * 输入: 123
 * 输出: 321
 * 
 * 
 * 示例 2:
 * 
 * 输入: -123
 * 输出: -321
 * 
 * 
 * 示例 3:
 * 
 * 输入: 120
 * 输出: 21
 * 
 * 
 * 注意:
 * 
 * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设，如果反转后整数溢出那么就返回
 * 0。
 * 
 */
#include <math.h>
#include <iostream>
#define IMax pow(2,31) - 1
class Solution {
public:
    int reverse(int x) {
        int value = 0;
        int n = 0;
        while(x  != 0) {
            n = x % 10;
            if (value > INT_MAX/10 || (value == INT_MAX / 10 && n > 7)) return 0;
            if (value < INT_MIN/10 || (value == INT_MIN / 10 && n < -8)) return 0;
            value = n + value * 10;
            x = x / 10;
        }
        return value;
    }
};

int main(int args, char* argv[]) {

    int n = pow(2, 19);
    Solution sol;
    n = sol.reverse(n);
    std::cout<<n<<std::endl;

    n = -pow(2, 19);
    n = sol.reverse(n);
    std::cout<<n<<std::endl;

    n = 123456;
    n = sol.reverse(n);
    std::cout<<n<<std::endl;

    n = -123456;
    n = sol.reverse(n);
    std::cout<<n<<std::endl;

    n = 320;
    n = sol.reverse(n);
    std::cout<<n<<std::endl;

    getchar();
    return 0;
}
